The efficiency of either reading or writing relatively small blocks of data from and to a hard drive system, such as a RAID, tends to be much less than the efficiency of the same operations for relatively large blocks of data. These read and write requests are generally referred to as IO requests herein, and the data is generally referred to as IO herein. One reason for this reduced efficiency is that a relatively greater number of interrupts and IO requests are generated for smaller IO blocks than are generated for larger IO blocks. This increases the utilization of the central processing unit, and generally reduces the total IO throughput rate. In many disc operations, such as RAID logical drive read operations, the driver may read from more than one drive. Sometimes the IO falls on the same drive and results in multiple reads or writes from and to the same strip of data on a given drive.
One way to increase the efficiency of a driver is to use what is called “command coalescing.” Command coalescing is a technique that reduces the number of IO requests and thereby increases system throughput. Command coalescing is implemented by holding a number of IO requests, and then performing them all at once. The intention is that some of the requests are for data that is overlapping or contiguous, so that only a single larger IO request can be processed for those blocks, instead of the multiple smaller requests that were originally received by the driver. However, for this technique to be implemented, the driver must be able to store a relatively large number of outstanding IO commands, in order to increase the probability of effective coalescing of the commands.
Unfortunately, low level software drivers, such as those for RAIDs, are typically allowed access to only a relatively limited amount of memory resources and, therefore, it is advisable to reduce the number of interrupts in the system to increase the throughput of the system. Thus, software drivers such as these typically have IO size limitations, and can only handle a relatively small number of outstanding commands at the same time. If the IO size is small and the driver can only handle a small number of outstanding IO requests, then the possibility of gaining any improvements in efficiency through command coalescence is relatively small.
What is needed, therefore, is a system that overcomes problems such as those described above, at least in part.